\section[Spring Framework 3.0.5]{Spring Framework 3.0.5\footnote{\url{http://www.springsource.org/}}}
\label{chap:spring}

Spring je framework pro vývoj {\java} aplikací, z něhož jsme v této práci použili Inversion of Control kontejner.

Inversion of Control (IoC) \cite{spring001} je způsob programování, kdy se závislosti mezi objekty
předávají pouze pomocí argumentů konstruktorů, argumentů továrních metod nebo
\textit{vlastností}. Objekty potom spravuje externí systém (IoC
kontejner), který vytváří celou strukturu závislostí sám, typicky na základě deklarativního popisu v
konfiguračním souboru. Tímto způsobem nevzniká monolitická aplikace, nýbrž sada
stavebních bloků, ze kterých lze na základě konfiguračních souborů stavět hotová
řešení.

Níže vysvětlujeme několik pojmů používaných v souvislosti s IoC ve Spring
Frameworku:
\begin{description}
\item[Bean] je jakýkoliv objekt, který je spolu se svými závislostmi vytvářen a spravován
IoC kontejnerem. 
\item[Vlastnost (property)] třídy je speciální členská proměnná třídy, ke které
programátor nepřistupuje přímo, nýbrž při jejím čtení a nastavování dochází k
volání metod, které můžou např. zvalidovat novou hodnotu, v případě potřeby
vygenerovat výjimku, zavolat další události atp. \java, na rozdíl např. od
\csharp, nemá podporu vlastností na úrovni jazyka, proto se používá dvojice
přístupových metod \textit{getter}/\textit{setter}.\footnote{Jelikož vlastnosti, které jsou dostupné pouze pro čtení,
nejsou přímo nastavitelné pomocí Spring Frameworku, nezajímají nás gettery bez odpovídajících
setterů.} Např. vlastnost \lstinline!xxx! bude v kódu vypadat
takto:
\inclst{java_properties_01}
\item[Aplikační kontext] je objekt, který se primárně stará o vytváření a ničení beanů. Typicky pro celou aplikaci
existuje jenom jeden aplikační kontext (lze použít návrhový vzor Singleton\cite{pecinovsky001}).
\end{description}

Nyní následují příklady definic konkrétních beanů se stručnými popisy (viz
příklady \ref{052:spring:first} až \ref{052:spring:last}). Všechny příklady jsou převzaty ze skutečného konfiguračního
souboru aplikace \lstinline!volkapp! (viz kapitola \ref{chap:implementation:volkapp}).

\begin{lstlisting}[label=052:spring:first, caption={Vytvoření jednoduchého beanu voláním výchozího (neparametrického)
konstruktoru bez nastavování vlastností. Bean bude v systému (v aplikačním kontextu a pro ostatní beany) dostupný pod indexem \lstinline!volk.stdout!.}]
<bean 
   id="volk.stdout"
   class="cz.cuni.mff.ufal.ConsoleUserTextOutput" />
\end{lstlisting}

\begin{lstlisting}[caption={V tom případě se pro vytvoření beanu použije konstruktor se dvěma parametry. Navíc se
později během vypínání aplikace zavolá metoda \lstinline!close! tohoto beanu. Bean je dostupný pod indexem
\lstinline!volk.tts!.}]
<bean 
   id="volk.tts" 
   destroy-method="close"
   class="cz.cuni.mff.ufal.volk.services.EposTextToSpeech">
  <constructor-arg
     value="C:\Program Files (x86)\Epos_2.4\bin\epos.exe"/>
  <constructor-arg 
     value="4444"/>
</bean>
\end{lstlisting}

\begin{lstlisting}[caption={Vytvoření beanu pomocí konstruktoru s jedním parametrem typu \lstinline!String!. Navíc
hned po vytvoření beanu dojde k nastavení vlastnosti \lstinline!encoding!.}, breaklines=true]
<bean id="feed.ihned"
      class="cz.cuni.mff.ufal.volk.RssInputProcessor.FeedConfiguration">
  <constructor-arg value="http://ihned.cz/?p=000000_rss" />
  <property name="encoding" value="windows-1250" />
</bean>
\end{lstlisting}

\begin{lstlisting}[label=052:spring:last, caption={Vytvoření asociativního seznamu.}]
<util:map id="services">
  <entry key="volk.tts" value-ref="volk.tts" />
  <entry key="volk.langrec" value-ref="volk.langrec" />
  <entry key="volk.stdout" value-ref="volk.stdout" />
  <entry key="volk.sndconv" value-ref="volk.sndconv" />
</util:map>
\end{lstlisting}